﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace StockVentas
{
    public partial class frmArqueoCajaAdmin : Form
    {
        DataSet dt;
        DataTable tblPcs;
        DataTable tblLocales;
        DataTable tblVentas;
        DataTable tblDetalle;
        DataTable tempDetalle;
        DataTable tblArticulos;
        DataTable tblFormasPago;
        DataTable tblTesoreria;
        DataTable tblFondoCajaInicial;
        DataTable tblFondoCajaFinal;
        DataView viewVentas;
        DataView viewTesoreria;
        public DateTime fechaDesde;
        public DateTime fechaHasta;
        public int idLocal;
        public string nombreLocal;
        public int idPc;
        int intPc;
        double dblTesoreria;
        frmProgress progreso;
        string formularioOrigen;
        string accionProgress;
        private int? codigoError = null;

        public frmArqueoCajaAdmin()
        {
            InitializeComponent();
            Cursor.Current = Cursors.WaitCursor;
            string strFilePath = Application.StartupPath + "\\Datasets_xml\\";
            if (File.Exists(strFilePath + "Pc.xml"))
            {
                tblPcs = new DataTable();
                tblPcs.ReadXml(strFilePath + "Pc.xml");
            }
            if (File.Exists(strFilePath + "Locales.xml"))
            {
                tblLocales = new DataTable();
                tblLocales.ReadXml(strFilePath + "Locales.xml");
            }
            if (File.Exists(strFilePath + "FormasPago.xml"))
            {
                tblFormasPago = new DataTable();
                tblFormasPago.ReadXml(strFilePath + "FormasPago.xml");
            }
            DataGridViewImageColumn imageColumn2 = new DataGridViewImageColumn();
            Image image2 = global::StockVentas.Properties.Resources.document_edit;
            imageColumn2.Image = image2;
            imageColumn2.Name = "Editar";
            dgvTesoreria.Columns.Add(imageColumn2);
            DataGridViewImageColumn imageColumn = new DataGridViewImageColumn();
            Image image = global::StockVentas.Properties.Resources.delete16;
            imageColumn.Image = image;
            imageColumn.Name = "Borrar";
            dgvTesoreria.Columns.Add(imageColumn);

            dgvTesoreria.CellClick += new DataGridViewCellEventHandler(dgvTesoreria_CellClick);

            DataGridViewImageColumn imageColumn3 = new DataGridViewImageColumn();
            imageColumn3.Image = image2;
            imageColumn3.Name = "Editar";
            dgvVentas.Columns.Add(imageColumn3);

            DataGridViewImageColumn imageColumn4 = new DataGridViewImageColumn();
            imageColumn4.Image = image;
            imageColumn4.Name = "Borrar";
            dgvVentas.Columns.Add(imageColumn4);

            dgvVentas.CellClick += new DataGridViewCellEventHandler(dgvVentas_CellClick);


            if (File.Exists(strFilePath + "Articulos.xml"))
            {
                tblArticulos = new DataTable();
                tblArticulos.ReadXml(strFilePath + "Articulos.xml");
            }
        }

        private void frmArqueoCaja_Load(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;
            lblLocal.Text = nombreLocal;
            lblFecha.Text = fechaDesde.ToString("dd-MM-yyyy");
            string strFechaDesde = fechaDesde.ToString("yyyy-MM-dd 00:00:00"); //fecha string para mysql
            fechaHasta = fechaHasta.AddDays(1);
            string strFechaHasta = fechaHasta.ToString("yyyy-MM-dd 00:00:00"); //fecha string para mysql
            accionProgress = "cargar";
            formularioOrigen = "frmArqueoCajaAdmin";
            progreso = new frmProgress(strFechaDesde, strFechaHasta, idPc, formularioOrigen, accionProgress);
            progreso.ShowDialog();
            dt = frmProgress.dsArqueo;
            if (dt == null)
            {
                Close();
                return;
            } 
            tblVentas = dt.Tables[0];
            tblDetalle = dt.Tables[1];
            tblFondoCajaInicial = dt.Tables[2];
            tblFondoCajaFinal = dt.Tables[3];
            tblTesoreria = dt.Tables[4];
            dt.Tables[4].TableName = "TesoreriaMovimientos";
            fechaDesde = DateTime.Parse(fechaDesde.ToString("yyyy-MM-dd"));
            fechaHasta = DateTime.Parse(fechaHasta.ToString("yyyy-MM-dd"));
            
            #region ventasGrid

            var query =
                    from venta in tblVentas.AsEnumerable()
                    where (venta.Field<int>("IdPCVEN") == idPc
                    && (venta.Field<DateTime>("FechaVEN") >= fechaDesde && venta.Field<DateTime>("FechaVEN") < fechaHasta))
                    orderby venta.Field<DateTime>("FechaVEN")
                    select new
                    {
                        Id = venta.Field<int>("IdVentaVEN"),
                        Fecha = venta.Field<DateTime>("FechaVEN")
                    };
            DataTable tempVenta = new DataTable();
            tempVenta.Columns.Add("IdVentaVEN", typeof(int));
            tempVenta.Columns.Add("FechaVEN", typeof(DateTime));
            foreach (var registro in query)
            {
                DataRow fila = tempVenta.NewRow();
                fila["IdVentaVEN"] = registro.Id;
                fila["FechaVEN"] = registro.Fecha;
                tempVenta.Rows.Add(fila);
            }

            var query2 =
                    from venta in tempVenta.AsEnumerable()
                    from detalle in tblDetalle.AsEnumerable()
                    from articulo in tblArticulos.AsEnumerable()
                    from formaPago in tblFormasPago.AsEnumerable()
                    where venta.Field<int>("IdVentaVEN") == detalle.Field<int>("IdVentaDVEN")
                        && articulo.Field<string>("IdArticuloART") == detalle.Field<string>("IdArticuloDVEN")
                        && formaPago.Field<int>("IdFormaPagoFOR") == detalle.Field<int>("IdFormaPagoDVEN")
                    orderby venta.Field<DateTime>("FechaVEN")
                    select new
                    {
                        Fecha = venta.Field<DateTime>("FechaVEN"),
                        Id = detalle.Field<int>("IdVentaDVEN"),
                        Articulo = detalle.Field<string>("IdArticuloDVEN"),
                        Descripción = articulo.Field<string>("DescripcionART"),
                        Cantidad = detalle.Field<int>("CantidadDVEN"),
                        Precio = detalle.Field<double>("PrecioPublicoDVEN"),
                        FormaPago = formaPago.Field<string>("DescripcionFOR"),
                        Subtotal = detalle.Field<int>("CantidadDVEN") * detalle.Field<double>("PrecioPublicoDVEN")
                    };
            tempDetalle = new DataTable();
            tempDetalle.Columns.Add("FechaVEN", typeof(DateTime));
            tempDetalle.Columns.Add("IdVentaDVEN", typeof(int));
            tempDetalle.Columns.Add("Artículo", typeof(string));
            tempDetalle.Columns.Add("Descripción", typeof(string));
            tempDetalle.Columns.Add("Cantidad", typeof(int));
            tempDetalle.Columns.Add("Precio", typeof(double));
            tempDetalle.Columns.Add("FormaPago", typeof(string));
            tempDetalle.Columns.Add("Subtotal", typeof(double));
            foreach (var registro in query2)
            {
                DataRow fila = tempDetalle.NewRow();
                fila["FechaVEN"] = registro.Fecha;
                fila["IdVentaDVEN"] = registro.Id;
                fila["Artículo"] = registro.Articulo;
                fila["Descripción"] = registro.Descripción;
                fila["Cantidad"] = registro.Cantidad;
                fila["Precio"] = registro.Precio;
                fila["FormaPago"] = registro.FormaPago;
                fila["Subtotal"] = registro.Subtotal;
                tempDetalle.Rows.Add(fila);
            }

            dgvVentas.DataSource = tempDetalle;
            dgvVentas.Columns["FechaVEN"].HeaderText = "Fecha";
            dgvVentas.Columns["IdVentaDVEN"].HeaderText = "Nº venta";
            dgvVentas.Columns["FormaPago"].HeaderText = "Forma pago";
            dgvVentas.Columns["Subtotal"].Visible = false;
            dgvVentas.Columns["Cantidad"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            dgvVentas.Columns["Precio"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            #endregion

            var queryPc =
                    from pc in tblPcs.AsEnumerable()
                    from local in tblLocales.AsEnumerable()
                    where (pc.Field<int>("IdLocalPC") == local.Field<int>("IdLocalLOC")
                    && local.Field<int>("IdLocalLOC") == idLocal)
                    && pc.Field<string>("Detalle") == "Administracion"
                    select new
                    {
                        IdPc = pc.Field<int>("IdPC")
                    };
            foreach (var registro in queryPc)
            {
                intPc = registro.IdPc;
            }
            viewTesoreria = new DataView(tblTesoreria);
            dgvTesoreria.DataSource = viewTesoreria;
            dgvTesoreria.Columns["IdPcTESM"].Visible = false;
            dgvTesoreria.Columns["FechaTESM"].Visible = false;
            dgvTesoreria.Columns["IdMovTESM"].HeaderText = "Nº Mov.";
            dgvTesoreria.Columns["DetalleTESM"].HeaderText = "Detalle";
            dgvTesoreria.Columns["ImporteTESM"].HeaderText = "Importe";
            dblTesoreria = 0;
            foreach (DataRowView dr in viewTesoreria)
            {
                dblTesoreria += (double)dr["ImporteTESM"];
            }

            var ventaTotal = query2.Sum(s => s.Subtotal);
            lblTotal.Text = "$ " + ventaTotal.ToString();
            var subtotalEfectivo = from detalle in tempDetalle.AsEnumerable()
                                   where (detalle.Field<string>("FormaPago") == "EFECTIVO")
                                   select new
                                   {
                                       Efectivo = detalle.Field<double>("Subtotal")
                                   };
            var totalEfectivo = subtotalEfectivo.Sum(efectivo => efectivo.Efectivo);
            lblEfectivo.Text = "$ " + totalEfectivo.ToString();
            double dblEfectivo = Convert.ToDouble(totalEfectivo.ToString());
            var subtotalTarjeta = from detalle in tempDetalle.AsEnumerable()
                                  where (detalle.Field<string>("FormaPago") != "EFECTIVO")
                                  select new
                                  {
                                      Tarjeta = detalle.Field<double>("Subtotal")
                                  };
            var totalTarjeta = subtotalTarjeta.Sum(tarjeta => tarjeta.Tarjeta);
            lblTarjeta.Text = "$ " + totalTarjeta.ToString();
            lblTesoreria.Text = "$ " + dblTesoreria.ToString();

            double dblCajaInicial = 0;
            lblCajaInicial.Text = "$ " + dblCajaInicial.ToString();
            if (tblFondoCajaInicial.Rows.Count != 0)
            {
                lblCajaInicial.Text = "$ " + tblFondoCajaInicial.Rows[0][0].ToString();
                dblCajaInicial = Convert.ToDouble(tblFondoCajaInicial.Rows[0][0].ToString());
            }
            double dblEfectivoExistente = dblEfectivo + dblCajaInicial + dblTesoreria;
            lblEfectivoExistente.Text = "$ " + dblEfectivoExistente.ToString();
            double dblCajaFinal = 0;
            if (tblFondoCajaFinal.Rows.Count != 0)
            {
                lblCajaFinal.Text = "$ " + tblFondoCajaFinal.Rows[0][0].ToString();
                dblCajaFinal = Convert.ToDouble(tblFondoCajaFinal.Rows[0][0].ToString());
            }
            lblCajaFinal.Text = "$ " + dblCajaFinal.ToString();
            double dblEfvoEntregar = dblEfectivoExistente - dblCajaFinal;
            lblEfectivoEntregar.Text = "$ " + dblEfvoEntregar.ToString();
            Cursor.Current = Cursors.Arrow;
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void dgvVentas_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex < 0) return;
            if (e.ColumnIndex == dgvVentas.Columns["Editar"].Index)
            {
                frmVentas frm = new frmVentas(dgvVentas.CurrentRow.Cells["IdVentaDVEN"].Value.ToString(), idPc);
                frm.ShowDialog();
            }
            if (e.ColumnIndex == dgvVentas.Columns["Borrar"].Index)
            {
                if (MessageBox.Show("¿Desea borrar este registro y todos los movimientos relacionados?", "NcSoft",
                        MessageBoxButtons.YesNo, MessageBoxIcon.Stop) == DialogResult.Yes)
                {
                    Cursor.Current = Cursors.WaitCursor;
                    int PK = Convert.ToInt32(dgvVentas.CurrentRow.Cells["IdVentaDVEN"].Value.ToString());
                    accionProgress = "grabar";
                    formularioOrigen = "frmArqueoCajaAdmin_borrarVenta";
                    progreso = new frmProgress(PK, formularioOrigen, accionProgress, ref codigoError);
                    progreso.ShowDialog();
                    if (codigoError != null)
                    {
                        Close();
                        return;
                    }
                    viewVentas = new DataView(tempDetalle);
                    viewVentas.RowFilter = "IdVentaDVEN = '" + PK + "'";
                    foreach (DataRowView row in viewVentas)
                    {
                        row.Delete();
                    }
                    tempDetalle.AcceptChanges();
                    Cursor.Current = Cursors.Arrow;
                }
            }
        }

        void dgvTesoreria_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex < 0) return;
            if (e.ColumnIndex == dgvTesoreria.Columns["Editar"].Index)
            {
                frmTesoreriaMov frm = new frmTesoreriaMov();
                frm.PK = dgvTesoreria.CurrentRow.Cells["IdMovTESM"].Value.ToString();
                frm.idLocal = idLocal;
                frm.idPc = idPc;
                frm.ShowDialog();
            }
            if (e.ColumnIndex == dgvTesoreria.Columns["Borrar"].Index)
            {
                if (MessageBox.Show("¿Desea borrar este registro?", "NcSoft",
                        MessageBoxButtons.YesNo, MessageBoxIcon.Stop) == DialogResult.Yes)
                {
                    Cursor.Current = Cursors.WaitCursor;
                    int PK = Convert.ToInt32(dgvTesoreria.CurrentRow.Cells["IdMovTESM"].Value.ToString());
                    accionProgress = "grabar";
                    formularioOrigen = "frmArqueoCajaAdmin_borrarTesoreria";
                    progreso = new frmProgress(PK, formularioOrigen, accionProgress, ref codigoError);
                    progreso.ShowDialog();
                    if (codigoError != null)
                    {
                        Close();
                        return;
                    }
                    viewTesoreria.RowFilter = "IdMovTESM = '" + PK + "'";
                    foreach (DataRowView row in viewTesoreria)
                    {
                        row.Delete();
                    }
                    tblTesoreria.AcceptChanges();
                    Cursor.Current = Cursors.Arrow;
                }
            }
        }

    }

}
